import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import os
import matplotlib as mpl
from matplotlib.font_manager import FontProperties
from matplotlib.ticker import MaxNLocator
from datetime import datetime

# 设置中文字体支持
try:
    plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'WenQuanYi Micro Hei', 'STXihei']
    plt.rcParams['axes.unicode_minus'] = False
    print("中文支持已启用")
except:
    print("中文支持设置失败，将使用英文")

# 读取Excel文件
file_path = 'E:/M/MathModel/23国赛C题/ds/附件5.xlsx'
sale = pd.read_excel(file_path, sheet_name='合并')
print("数据读取成功！总记录数:", len(sale))

# 转换日期格式
sale['销售日期'] = pd.to_datetime(sale['销售日期'])

# 筛选辣椒类数据
pepper_data = sale[sale['分类名称'] == '辣椒类']

if pepper_data.empty:
    print("警告: 辣椒类没有找到数据! 程序退出")
    exit()

print(f"\n辣椒类记录数: {len(pepper_data)}")
print(f"辣椒类商品种类数: {pepper_data['单品名称'].nunique()}")

# 提取所有辣椒类商品名称
pepper_products = pepper_data['单品名称'].unique().tolist()
print("\n辣椒类商品列表:")
print(pepper_products)

# 数据准备：按月分组统计每个商品的销售量
pepper_data['年月'] = pepper_data['销售日期'].dt.to_period('M')

monthly_sales = pepper_data.groupby(['单品名称', '年月'])['销量(千克)'].sum().reset_index()

# 转换为日期格式
monthly_sales['日期'] = monthly_sales['年月'].dt.to_timestamp()

# 创建图表
plt.figure(figsize=(18, 10))

# 创建颜色映射
colors = plt.cm.tab20(np.linspace(0, 1, len(pepper_products)))

# 绘制每条折线
for i, product in enumerate(pepper_products):
    # 筛选当前商品的数据
    product_data = monthly_sales[monthly_sales['单品名称'] == product]

    # 按日期排序
    product_data = product_data.sort_values('日期')

    # 绘制折线图
    plt.plot(product_data['日期'], product_data['销量(千克)'],
             label=product, color=colors[i], linewidth=2.5, marker='o', markersize=6)

plt.title('辣椒类各商品月度销售量变化趋势', fontsize=20, pad=20)
plt.xlabel('月份', fontsize=14)
plt.ylabel('销售量(千克)', fontsize=14)

# 设置X轴
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=3))  # 每3个月一个刻度
plt.xticks(rotation=45, ha='right', fontsize=12)
plt.yticks(fontsize=12)

# 添加网格线
plt.grid(True, linestyle='--', alpha=0.3)

# 添加图例
plt.legend(fontsize=10, bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)

# 添加数据标签
for product in pepper_products:
    product_data = monthly_sales[monthly_sales['单品名称'] == product]
    if not product_data.empty:
        # 找到销量最高的点
        max_idx = product_data['销量(千克)'].idxmax()
        max_date = product_data.loc[max_idx, '日期']
        max_sales = product_data.loc[max_idx, '销量(千克)']

        plt.annotate(f'{max_sales:.1f}',
                     xy=(max_date, max_sales),
                     xytext=(max_date, max_sales + product_data['销量(千克)'].max() * 0.05),
                     fontsize=9, ha='center',
                     arrowprops=dict(arrowstyle="->", color='gray', alpha=0.7))

# 调整布局
plt.tight_layout(rect=[0, 0, 0.85, 1])  # 为图例留出空间

# 保存图表
save_dir = 'E:/M/MathModel/23国赛C题/ds/销售分析图'
os.makedirs(save_dir, exist_ok=True)
save_path = os.path.join(save_dir, '辣椒类各商品月度销售量折线图.png')
plt.savefig(save_path, dpi=300, bbox_inches='tight')
print(f"\n图表已保存至: {save_path}")

plt.show()